package net.ermannofranco.xmltest;

/*
 * PiattaformaScolastica_schema.java
 *
 * Created on 28 marzo 2004, 20.02
 */
import static net.ermannofranco.xml.schema.Use.OPTIONAL;
import static net.ermannofranco.xml.schema.Use.REQUIRED;
import static net.ermannofranco.xml.schema.XmlType.BOOLEAN;
import static net.ermannofranco.xml.schema.XmlType.DECIMAL;
import static net.ermannofranco.xml.schema.XmlType.NMTOKEN;
import static net.ermannofranco.xml.schema.XmlType.POS_INTEGER;
import static net.ermannofranco.xml.schema.XmlType.STRING;
import net.ermannofranco.xml.schema.ComplexType;
import net.ermannofranco.xml.schema.ExtensionSimple;
import net.ermannofranco.xml.schema.Facet;
import net.ermannofranco.xml.schema.Schema;
import net.ermannofranco.xml.schema.Sequence;
import net.ermannofranco.xml.schema.SimpleType;

import org.junit.Assert;
import org.junit.Test;

public class PiattaformaScolastica_schema extends Schema {

	private static final long serialVersionUID = 4720158207258062024L;

	public PiattaformaScolastica_schema() {

		// Il documento Schema estende un Documento xml, quindi anche in questo
		// caso e' l'unico istanziabile.
		setElemFormDefQualified(true)// metodo di Schema
		;

		ComplexType ct;
		// SimpleType st;
		ExtensionSimple ex;
		Sequence seq;

		SimpleType valuta = addSimpleType("valuta");
		valuta.setRestriction(STRING).addEnumerationFacet("lire", "euro");
		SimpleType tipoCosto = addSimpleType("tipoCosto");
		tipoCosto.setRestriction(DECIMAL).addFacet(Facet.MINEXCLUSIVE, "0")
				.addFacet(Facet.FRACTIONDIGITS, "2");
		addSimpleType("durata").setRestriction(STRING).addEnumerationFacet(
				"trimestrale", "semestrale", "annuale");
		addSimpleType("esame").setRestriction(STRING).addEnumerationFacet(
				"orale", "scritto", "orale/scritto");
		addSimpleType("livello").setRestriction(STRING).addEnumerationFacet(
				"base", "medio", "avanzato");
		addSimpleType("idAnno").setRestriction(POS_INTEGER).addFacet(
				Facet.MININCLUSIVE, "1999")
				.addFacet(Facet.MAXINCLUSIVE, "2050");
		SimpleType email = addSimpleType("email");
		email.setRestriction(STRING).addFacet(Facet.PATTERN,
				"([a-zA-Z\\d.-_])+@([a-zA-Z\\d])+.([a-zA-Z\\d])+");

		(ct = addComplexType("costo"))
				.addDocumentation("tipo numerico con un attributo valuta, lire o euro");
		ct.setSimpleContent().setExtension(tipoCosto).addTagAttribute("valuta",
				valuta, OPTIONAL).setDefault("euro");

		ComplexType dettaglioDocente = addComplexType("dettaglio_docente");
		dettaglioDocente.setMixed().setSequence().addElem("geografico",
				"geografico").setZeroOrOneOccurs();

		(ct = addComplexType("docente")).setSequence().addElem(
				"dettaglio_docente", dettaglioDocente).setZeroOrOneOccurs();
		ct.addTagAttribute("nome", STRING, OPTIONAL);

		(ct = addComplexType("geografico"))
				.addDocumentation("tipo testo con attributi email, tel");
		ex = ct.setSimpleContent().setExtension(STRING);
		ex.addTagAttribute("email", email, OPTIONAL);
		ex.addTagAttribute("tel", STRING, OPTIONAL);

		seq = (ct = addComplexType("anno")).setSequence();
		seq.addElem("docente", "docente").setUnboundedMaxOccurs();
		seq.addElem("costo", "costo");
		ct.addTagAttribute("idAnno", "idAnno", REQUIRED);
		ct.addTagAttribute("attivo", BOOLEAN, REQUIRED);
		ct.addTagAttribute("iscritti", POS_INTEGER, OPTIONAL);

		seq = (ct = addComplexType("corso")).setSequence();
		seq.addElem("descrizione", STRING);
		seq.addElem("obiettivi", STRING);
		seq.addElem("background", STRING);
		seq.addElem("periodo_esami", STRING);
		seq.addElem("anno", "anno").setAllPossibleOccurs();
		ct.addTagAttribute("codice", NMTOKEN, REQUIRED);
		ct.addTagAttribute("nomeComune", STRING, REQUIRED);
		ct.addTagAttribute("durata", "durata", REQUIRED);
		ct.addTagAttribute("esame", "esame", REQUIRED);
		ct.addTagAttribute("livello", "livello", REQUIRED);

		addElem("scuola").setComplexType().setSequence().addElem("corso",
				"corso").setMinOccurs(1).setUnboundedMaxOccurs();

		// save("../generati/" + getClass().getSimpleName());// questo salva...

	}

	@Test
	public void test() {
		print();
		Assert.assertEquals(0, getErrors());
	}
}
